<?php

class Box {

	public $id;
	public $langcode;
	public $name;
	public $height;
	public $css;
	public $closed;
	public $closable;
	public $noheader;
	public $place;
	
	/**
	 * Ha ez true, akkor a BoxHandler nem rakja a dobozt javascriptbe, és a doboz is üres
	 * html-t ad vissza
	 * @var boolean
	 */
	public $hidden;

	/**
	 * BoxTab objektumok id-vel kulcsolt tömbje
	 * @var array
	 */
	public $boxTabs;
	/**
	 * Melyik a default tab?
	 * @var int
	 */
	public $defaultTabId;

	/**
	 * Jelenleg ez az aktuális tabunk
	 * @var int
	 */
	public $currentTabId;


	public function Box($boxDBRecord)
	{
		$this->id = $boxDBRecord['id'];
		$this->langcode = $boxDBRecord['langcode'];
		$this->name = $boxDBRecord['name'];
		$this->height = $boxDBRecord['height'];
		$this->css = $boxDBRecord['css'];
		//$this->closed = ($boxDBRecord['closed'] == 't');
		//$this->closable = ($boxDBRecord['closable'] == 't');
		$this->closed = false;
		$this->closable = false;
		$this->noheader = ($boxDBRecord['noheader'] == 't');
		
		$this->place = $boxDBRecord['place'];
		
		$this->hidden = false;
			
		$this->loadTabsFromDB();
			
		$this->reloadState();
	}

	/**
	 * Session-ből visszaolvassa az állapotunkat - azaz melyik fül az aktív.
	 * Ha még nincs aktív fül, akkor kiválasztja a default fület.
	 */
	protected function reloadState()
	{
		if(IS_ADMIN_CONTEXT)
		// admin felületen nincs ilyen
		return;

		$currentTabId = FunctionLibrary::getSessionValue("bx_".$this->langcode."_".$this->id."_tId", null);
		// ezzel a hívással elérjük, hogy ha a tab még nincs beállítva vagy már nem létezik, akkor
		// visszaállunk a default-ra!
		$this->selectTab($currentTabId);
	}

	/**
	 * Session-be menti az állapotunkat - azaz melyik az aktív fül
	 */
	protected function saveState()
	{
		if(IS_ADMIN_CONTEXT)
		// admin felületen nincs ilyen
		return;
			
		$_SESSION["bx_".$this->langcode."_".$this->id."_tId"] = $this->currentTabId;
	}

	/**
	 * Kiválaszt egy fület aktívnak. Majd az állapotot a session-be menti.
	 * Ha a fül nem létezik, akkor a default fülre áll.
	 *
	 * @param int $tabId melyik fül?
	 */
	public function selectTab($tabId)
	{
		// van ilyen tab?
		// muszáj checkolni, hisz miközben a néző nézelődik az admin simán kidobhatta...
		if(is_null($this->getBoxTab($tabId)))
		$tabId = $this->defaultTabId;
			
		// változik?
		if($this->currentTabId == $tabId)
		return;

		$this->currentTabId = $tabId;
		$this->saveState();
	}

	/**
	 * Ez a cikk került ki, ehhez kéne szabni a tartalmat.
	 * Ha nincs kint cikk, akkor null érkezik. De súlyokat akkor is kapunk felülről, hog
	 * a listák tudjanak autoselectelni...
	 *
	 * @param int $articleId a cikk id-je - ami lehet null ha nincs kint cikk
	 */
	public function initContentForArticle($articleId)
	{
		foreach($this->boxTabs as $boxTabObj)
		{
			$boxTabObj->initContentForArticle($articleId);
		}
	}


	public function loadTabsFromDB()
	{
		$this->boxTabs = array();
		$this->defaultTabId = null;
			
		$boxTabRecs = SiteDBHelper::getBoxTabs($this->id);
		if(is_null($boxTabRecs))
		{
			$msg = "failed to init box-tab structure due to db error!";
			Log::error($msg);
			MailHelper::sendAdminMail("box system failed", $msg);
			return;
		}
			
		foreach($boxTabRecs as $boxTabRec)
		{
			$boxTabObj = new BoxTab($boxTabRec, $this);

			$this->boxTabs[$boxTabObj->id] = $boxTabObj;
			if($boxTabObj->isDefault)
			$this->defaultTabId = $boxTabObj->id;
		}
	}

	/**
	 * Visszaadja a default box fül objektumot vagy null ha nincs ilyen
	 *
	 * @return BoxTab
	 */
	public function getDefaultTab()
	{
		if(!is_null($this->defaultTabId))
		return $this->getBoxTab($this->defaultTabId);

		return null;
	}

	/**
	 * Visszaadja adott id-jű box fület vagy null ha nincs ilyen. Ha az id null, akkor i
	 * null megy vissza
	 *
	 * @param int $tabId
	 * @return BoxTab
	 */
	public function getBoxTab($tabId)
	{
		if(is_null($tabId))
		return null;

		if(isset($this->boxTabs[$tabId]))
		return $this->boxTabs[$tabId];
		else
		return null;
	}

	
	/**
	 * Megmondja h az adott cikk használatban van-e a content listákon, és ha igen akkor
	 * mely content listákon
	 * 
	 * @param $articleId
	 * @return array null ha egyetlen listán sincs használatban, amúgy a lista elemek tömbje, melyek használják
	 */
	public function getBoxContentListsWhereArticleIsUsed($articleId)
	{
		$allUsed = null;
		foreach($this->boxTabs as $boxTabObj)
		{
			$contentListsOfTab = $boxTabObj->getBoxContentListsWhereArticleIsUsed($articleId);
			$allUsed = FunctionLibrary::arrayConcatenate($allUsed, $contentListsOfTab);
		}
		
		return $allUsed;
	}
	

	/**
	 * Megmondja hogy van-e akár egyetlen content list is bármely tab-ban ami használja az adott
	 * cikket avagy nem
	 *
	 * @param $articleId
	 * @return boolean
	 */
	public function isArticleUsed($articleId)
	{
		foreach($this->boxTabs as $boxTabObj)
		{
			if($boxTabObj->isArticleUsed($articleId))
			return true;
		}
			
		return false;
	}

	/**
	 * Bejött egy kérés ehhez a box-hoz. Lehet tab váltás, lapozás, akármi.
	 * A kérés alapján frissíti a szerkezetét a box és felkészül a válasz generálásra
	 *
	 */
	public function serveRequest()
	{
		$action = FunctionLibrary::getGetOrPostValueSmart("action", null);
		if(!is_null($action))
		{
			if($action == "prev")
			{
				$boxTab = $this->getBoxTab($this->currentTabId);
				if(!is_null($boxTab))
				$boxTab->prevElement();
			}
			elseif($action == "next")
			{
				$boxTab = $this->getBoxTab($this->currentTabId);
				if(!is_null($boxTab))
				$boxTab->nextElement();
			}
			elseif($action == "first")
			{
				$boxTab = $this->getBoxTab($this->currentTabId);
				if(!is_null($boxTab))
				$boxTab->firstElement();
			}
			elseif($action == "last")
			{
				$boxTab = $this->getBoxTab($this->currentTabId);
				if(!is_null($boxTab))
				$boxTab->lastElement();
			}
			elseif($action == "tab")
			{
				$newTabId = FunctionLibrary::getGetOrPostValueSmart("tabId", null);
				if(!is_null($newTabId))
				{
					$newTabId = intval($newTabId);
					$this->selectTab($newTabId);
				}
				else
				{
					$msg = "parameter 'tabId' is missing from request, request skipped";
					Log::error($msg);
					MailHelper::sendAdminMail("box request error", $msg);
				}
			}
			else
			{
				$msg = "unknown action: '$action'! request skipped";
				Log::error($msg);
				MailHelper::sendAdminMail("box request error", $msg);
			}
		}
		else
		{
			$msg = "parameter 'action' is missing from request, request skipped";
			Log::error($msg);
			MailHelper::sendAdminMail("box request error", $msg);
		}
	}

	/**
	 * HTML forrás generálása
	 * @return string
	 */
	public function generateHtml()
	{
		if($this->hidden)
			return "";
		
		$boxTpl = BaseSitePage::loadTemplateFile("boxes/box.tpl.html");
			
		$boxTpl->setVariable("boxCss", $this->css);
		$boxTpl->setVariable("boxHeight", $this->height);
		$boxTpl->setVariable("boxId", $this->id);

		/* ez most nem kell
		 $boxTabsHtmls = array();
		 foreach($this->boxTabs as $boxTabObj)
		 {
		 array_push($boxTabsHtmls, $boxTabObj->generateHtml());
		 }
		 $boxTpl->setVariable("boxTabsHtml", implode("\n", $boxTabsHtmls));
		 */
		if(!$this->noheader) {
			if ($this->closable) {
				$boxHeaderTpl = BaseSitePage::loadTemplateFile("boxes/boxheader_closable.tpl.html");
				$boxHeaderTpl->setVariable("boxId", $this->id);
		
				if ($this->closed) {
					$filePath = "site/images/icon_openbox.gif";
					$boxHeaderTpl->setVariable("openOrCloseImg", $filePath);
					$boxHeaderTpl->setVariable("openOrClose", "open");
				} else {
					$filePath = "site/images/icon_closebox.gif";
					$boxHeaderTpl->setVariable("openOrCloseImg", $filePath);
					$boxHeaderTpl->setVariable("openOrClose", "close");
				}
			} else {
				$boxHeaderTpl = BaseSitePage::loadTemplateFile("boxes/boxheader_notclosable.tpl.html");
			}
			$boxHeaderTpl->setVariable("boxTitle", str_replace(" ", "&nbsp;", $this->name));
			$boxTpl->setVariable("boxHeaderHtml", $boxHeaderTpl->get());
		}
		else {
			$boxTpl->setVariable("boxHeaderHtml", '');
		}
		
		// pozíció
		if($this->place == BOX_PLACE_LEFT)
			$boxTpl->setVariable("boxPosition", "leftBox");
		elseif($this->place == BOX_PLACE_RIGHT)
			$boxTpl->setVariable("boxPosition", "rightBox");
		else
			$boxTpl->setVariable("boxPosition", "");
			
		// és most a content, amit az aktuális fültől kérünk!
		$currentBoxTabObj = $this->getBoxTab($this->currentTabId);
		if(!is_null($currentBoxTabObj))
		$content = $currentBoxTabObj->generateContentHtml();
		else
		$content = "";
		$boxTpl->setVariable("boxContentHtml", $content);
			
		// és végül: mi van a navigációval?
		$hasNext = false;
		$hasPrev = false;
		if(!is_null($currentBoxTabObj))
		{
			$hasNext = $currentBoxTabObj->hasNextElement();
			$hasPrev = $currentBoxTabObj->hasPrevElement();
		}
		$defContentList = $currentBoxTabObj->getDefaultBoxContentList();
		if(is_null($defContentList) || !$defContentList->manualStep || count($defContentList->articleIds) < 2)
		{
			// nincs navigáció!
			$boxTpl->replaceBlock("navigation", " ", false);
			$boxTpl->touchBlock("navigation");
		}
		else
		{
			$prevArrowHtml = "";
			$nextArrowHtml = "";

			if($hasPrev)
			{
				$prevLink = HydraLinkProvider::getLink("axBoxPrev", array("boxId"=>$this->id));
				//$prevArrowHtml = "<a href=\"$prevLink\" onclick=\"getBoxContent(this.href); return false;\"><img src=\"site/images/icon_prev.gif\"/><img src=\"site/images/icon_prev.gif\"/></a>";
				$prevArrowHtml = "<img src=\"site/images/icon_prev.gif\" onclick=\"getBoxContent('$prevLink', '$this->id');\" />";
			} else {
				$lastLink = HydraLinkProvider::getLink("axBoxLast", array("boxId"=>$this->id));
				//$prevArrowHtml = "<a href=\"$lastLink\" onclick=\"getBoxContent(this.href); return false;\"><img src=\"site/images/icon_prev.gif\"/><img src=\"site/images/icon_prev.gif\"/></a>";
				$prevArrowHtml = "<img src=\"site/images/icon_prev.gif\" onclick=\"getBoxContent('$lastLink', '$this->id');\" />";
			}
			if($hasNext)
			{
				$nextLink = HydraLinkProvider::getLink("axBoxNext", array("boxId"=>$this->id));
				//$nextArrowHtml = "<a href=\"$nextLink\" onclick=\"getBoxContent(this.href); return false;\"><img src=\"site/images/icon_next.gif\"/><img src=\"site/images/icon_next.gif\"/></a>";
				$nextArrowHtml = "<img src=\"site/images/icon_next.gif\" onclick=\"getBoxContent('$nextLink', '$this->id');\" />";
			} else {
				$firstLink = HydraLinkProvider::getLink("axBoxFirst", array("boxId"=>$this->id));
				//$nextArrowHtml = "<a href=\"$firstLink\" onclick=\"getBoxContent(this.href); return false;\"><img src=\"site/images/icon_next.gif\"/><img src=\"site/images/icon_next.gif\"/></a>";
				$nextArrowHtml = "<img src=\"site/images/icon_next.gif\" onclick=\"getBoxContent('$firstLink', '$this->id');\" />";
			}

			$boxTpl->setVariable("prevArrowHtml", $prevArrowHtml);
			$boxTpl->setVariable("nextArrowHtml", $nextArrowHtml);

		}

		// a végén is megcsináljuk az ellenőrzést, mivel a box content lista is hiddenre
		// tehette közben...
		if($this->hidden)
			return "";
		
		
		return $boxTpl->get();
	}


}
?>
